
//
//  QBStatusPictureView.swift
//  Wei91BoiOS
//
//  Created by bing on 16/3/26.
//  Copyright © 2016年 bing. All rights reserved.
//

import UIKit

import SDWebImage

class QBStatusPictureView: UICollectionView {
    
    // MARK: - 属性
    private let ReuseIdentifier = "ReuseIdentifier"
    // MARK: - 属性
    /// 要显示的图片URL数组
    var pictureURLs: [NSURL]? {
        didSet {
            // 拿到需要显示的图片的数组后，根据图片的数量来计算配图需要的宽高
            let size = calcViewSize()
            
            // 自己来更新自己的宽度和高度
            self.snp_updateConstraints { (make) -> Void in
                make.size.equalTo(size)
            }
            // 当拿到pictureURLs后.来根据pictureURLs的数量重新设置collectionView
            self.reloadData()
        }
    }
    
    /// 根据图片的数量来计算配图需要的宽高
    private func calcViewSize() -> CGSize {
        layout.itemSize = CGSize(width: QBStatusPictureCellWH, height: QBStatusPictureCellWH)
        layout.minimumInteritemSpacing = 0
        layout.minimumLineSpacing = 0
        
        let count = pictureURLs?.count ?? 0
        
        if count == 0 {
            layout.itemSize = CGSizeZero
            return CGSizeZero
        }
        
        // 单图会按照图片 原始尺寸 显示
        if count == 1 {
            // 一张图片默认的大小
            var imageSize = CGSize(width: QBStatusPictureCellWH, height: QBStatusPictureCellWH)
            //var imageSize = CGSize(width: 160, height: 120)
            // 获取图片的url地址
            
            let urlString = pictureURLs![0].absoluteString
            
            // 去本地获取对应图片的大小
            if let image = SDImageCache.sharedImageCache().imageFromDiskCacheForKey(urlString) {
                
                // 有图片
                imageSize = image.size
                
                //print("一张图片大小:\(imageSize):\(urlString)")
            }
            
            // 有些图片太小
            if imageSize.width < 40 {
                imageSize.width = 40
            }
            
            // 图片太大
            if imageSize.width > UIScreen.width * 0.5 {
                imageSize.width = UIScreen.width * 0.5
            }
            
            // 一定要返回这个值
            layout.itemSize = imageSize
            
            return imageSize
        }
        
        // 多张图片
        layout.minimumInteritemSpacing = QBStatusPictureMargin
        layout.minimumLineSpacing = QBStatusPictureMargin
        
        // 默认3列
        var column = QBStatusPictureMaxColumn
        
        // 有些情况只有2列
        if count == 2 || count == 4 {
            column = 2
        }
        
        // 计算总行数, 一定要注意:column是整数
        // 2 + 2 - 1 / 2 = 1
        // 3 + 3 - 1 / 3 = 1
        // 4 + 3 - 1 / 3 = 2
        // 5 + 3 - 1 / 3 = 2
        //...
        // 9 + 3 - 1 / 3 = 3
        
        let row = (count + column - 1) / column
        
        // 计算宽度 cell的宽度 * 列数 + (列数 - 1) * cell之间的间距
        let width = QBStatusPictureCellWH  * CGFloat(column) + (CGFloat(column) - 1) * QBStatusPictureMargin
        
        // 计算高度 cell的高度 * 行数 + (行数 - 1) * cell之间的间距
        let height = QBStatusPictureCellWH * CGFloat(row) + (CGFloat(row) - 1) * QBStatusPictureMargin
        
        return CGSize(width: width, height: height)
    }

    // MARK: - 属性
    /// 布局
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private let layout = UICollectionViewFlowLayout()
    
    init() {
        super.init(frame: CGRectZero, collectionViewLayout: layout)
        // 默认是true,如果一个控制器的view里面只有一个UIScrollView/子类,当点击状态栏scrollsToTop=true是可以滚动到顶部
        self.scrollsToTop = false
        // 配图视图设置数据源,谁成为数据源都可以只要实现UICollectionViewDataSource
        self.dataSource = self
        self.registerClass(QBStatusPictureViewCell.self, forCellWithReuseIdentifier: ReuseIdentifier)
        
        self.backgroundColor = UIColor.clearColor()
    }
}

extension QBStatusPictureView: UICollectionViewDataSource {
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return pictureURLs?.count ?? 0
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(ReuseIdentifier, forIndexPath: indexPath) as! QBStatusPictureViewCell
        
        //cell.backgroundColor = UIColor.random()
        // 给cell设置图片的NSURL地址
        cell.imageURL = pictureURLs?[indexPath.item]

        return cell
    }
}

// MARK: - 自定义cell
class QBStatusPictureViewCell: UICollectionViewCell {
    
    // MARK: - 属性
    var imageURL: NSURL? {
        didSet {
            // 使用SDWebImage来设置图片
            if let url = imageURL {
                bkgImageView.sd_setImageWithURL(url)
            }
        }
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        prepareUI()
    }
    
    private func prepareUI() {
        
        contentView.addSubview(bkgImageView)
        
        bkgImageView.snp_makeConstraints { (make) -> Void in
            make.edges.equalTo(contentView)
        }
        
        // 设置bkgImageView的内容填充模式
        bkgImageView.contentMode = UIViewContentMode.ScaleAspectFill
        
        // 超出imageView的剪掉
        bkgImageView.clipsToBounds = true
    }

    // MARK: - 懒加载
    /// 背景图片
    private lazy var bkgImageView: UIImageView = UIImageView()
}
